/**
 * 分页结果类
 * 与Java PageResult格式完全一致
 * 
 * 格式:
 * {
 *   "currentPage": 1,    // 当前页
 *   "perPage": 15,       // 每页大小
 *   "total": 100,        // 总记录数
 *   "data": []           // 数据列表
 * }
 */
export class PageResult<T> {
  /**
   * 当前请求页
   */
  currentPage: number;

  /**
   * 每页大小
   */
  perPage: number;

  /**
   * 总记录数
   */
  total: number;

  /**
   * 记录结果
   */
  data: T[];

  constructor(page: number, limit: number, total: number = 0, data: T[] = []) {
    this.currentPage = page;
    this.perPage = limit;
    this.total = total;
    this.data = data;
  }

  /**
   * 创建分页结果
   * @param page 页码
   * @param limit 每页数量
   * @returns PageResult<T>
   */
  static build<T>(page: number, limit: number): PageResult<T> {
    return new PageResult<T>(page, limit);
  }

  /**
   * 创建分页结果
   * @param page 页码
   * @param limit 每页数量
   * @param total 总记录数
   * @returns PageResult<T>
   */
  static buildWithTotal<T>(page: number, limit: number, total: number): PageResult<T> {
    return new PageResult<T>(page, limit, total);
  }

  /**
   * 创建分页结果
   * @param page 页码
   * @param limit 每页数量
   * @param total 总记录数
   * @param data 数据列表
   * @returns PageResult<T>
   */
  static buildWithData<T>(page: number, limit: number, total: number, data: T[]): PageResult<T> {
    return new PageResult<T>(page, limit, total, data);
  }

  /**
   * 设置数据
   * @param data 数据列表
   * @returns PageResult<T>
   */
  setData(data: T[]): PageResult<T> {
    this.data = data;
    return this;
  }

  /**
   * 设置总数
   * @param total 总记录数
   * @returns PageResult<T>
   */
  setTotal(total: number): PageResult<T> {
    this.total = total;
    return this;
  }

  /**
   * 转换为JSON格式
   * @returns object
   */
  toJSON(): object {
    return {
      currentPage: this.currentPage,
      perPage: this.perPage,
      total: this.total,
      data: this.data,
    };
  }
}
